package org.jeecg.modules.es.service;

import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.update.UpdateResponse;
import org.jeecg.modules.article.entity.Article;
import org.jeecg.modules.es.vo.KeywordsVO;
import org.jeecg.modules.es.vo.KnowledgeVO;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * TODO: es相关接口
 *
 * @author Zhang Hao yu
 * @date 2020/12/2 19:30
 */
public interface ElasticSearchService {


    /**
     * TODO: 批量插入数据统一接口，
     *
     * @param globalIndex 全局索引
     * @param timeout     超时时间
     * @param list        数据集泛型
     * @return boolean 执行是否成功
     * @throws IOException e
     * @author ZhangHaoyu
     */
    boolean bulkData(String globalIndex, String timeout, List<?> list) throws IOException;


    /**
     * TODO: 查询对应索引是否存在
     *
     * @param index 索引名称
     * @return boolean
     * @author ZhangHaoyu
     */
    boolean getIndexExists(String index) throws IOException;

    /**
     * TODO: 查询对应文档是否存在
     *
     * @param index 索引名
     * @param id    文档id
     * @return boolean
     * @author ZhangHaoyu
     */
    boolean getDocumentExists(String index, String id) throws IOException;

    /**
     * TODO: 根据参数获取文档信息
     *
     * @param index 索引名
     * @param id    文档id
     * @return org.elasticsearch.action.get.GetResponse
     * @author ZhangHaoyu
     */
    GetResponse getDocumentResponse(String index, String id);


    /**
     * TODO: 更新文档信息
     *
     * @param index   索引名
     * @param id      文档id
     * @param object  实体参数
     * @param timeout 最大等待时间
     * @return UpdateResponse
     * @author ZhangHaoyu
     */
    UpdateResponse updateDocument(String index, String id, Object object, String timeout);


    /**
     * TODO: 删除文档信息
     *
     * @param index   索引名
     * @param id      id
     * @param timeout 最大等待时间
     * @return org.elasticsearch.action.delete.DeleteResponse
     * @author ZhangHaoyu
     */
    DeleteResponse deleteDocument(String index, String id, String timeout);


    /**
     * TODO: 搜索功能实现，内置高亮
     *
     *
     * @author ZhangHaoyu
     * @param keywords 关键字
     * @param pageNo 当前页 在es中应该为从下角标第几个开始
     * @param pageSize 大小
     * @param index 索引名称
     * @return java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     */
    List<Map<String, Object>> searchPage(String keywords, int pageNo, int pageSize,String index);

    /**
     * TODO: 单条数据插入
     *
     *
     * @author ZhangHaoyu
     * @param article 文章对象
     * @param index 索引名称
     * @return void
     */
    void insertSource(Article article, String index) throws IOException;
    /**
     * TODO: 单条数据插入
     *
     *
     * @author ZhangHaoyu
     * @param knowledge 文章对象
     * @param index 索引名称
     * @return void
     */
    void insertSource(KnowledgeVO knowledge, String index) throws IOException;

    /**
     * TODO: 高级检索
     *
     *
     * @author ZhangHaoyu
     * @param keywords
     * @param pageNo
     * @param pageSize
     * @param philKnowledge
     * @return java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     */
    List<Map<String, Object>> searchPageMajor(KeywordsVO keywords, Integer pageNo, Integer pageSize, String philKnowledge);
}